#ifndef _GTX31X_API_H_
#define _GTX31X_API_H_

#include "gtx31x_board.h"

#if _KEYBOARD_FUNCTION_ENABLE_

// IIC 操作地址
#define GTX31X_IIC_ADDRESS                                 0xB6

// 获取寄存器失败次数    - 5次
#define GTX31X_GET_REGISTER_FAILURE_TIMES                  (5ul)

/**
 * @brief 定义寄存器
 * 
 */
typedef enum
{
  GTX31X_HARDWAREATTR         = 0x01, // 硬件属性
  GTX31X_TOUCH_OUTPUT_1       = 0x02, // 触摸检测状态位1
  GTX31X_TOUCH_OUTPUT_2       = 0x03, // 触摸检测状态位2
  GTX31X_SIN_CH_EN_1          = 0x04, // 触摸通道使能位1
  GTX31X_SIN_CH_EN_2          = 0x05, // 触摸通道使能位2
  GTX31X_RESET_CONTORL        = 0x0A, // 复位控制
  GTX31X_SLEEP_CONTORL        = 0x0B, // 睡眠控制
  GTX31X_IIC_PU_CONTROL       = 0x0C, // IIC总线上拉控制
  GTX31X_CTTL_BIT_0           = 0x10, // 功能控制位1
  GTX31X_CTRL_BIT_1           = 0x11, // 功能控制位2
  GTX31X_CAL_TIME             = 0x13, // 校准时间选择位
  GTX31X_SEN_IDLE_TIME        = 0x14, // 空闲周期-H
  GTX31X_SEN_IDLE_TIME_SUFFIX = 0x15, // 空闲周期-L
  GTX31X_BUSY_TO_IDLE_TIME    = 0x17, // 繁忙-空闲时间
  GTX31X_I2B_MODE             = 0x18, // 空闲到忙模式控制位
  GTX31X_SLIDE_MODE           = 0x19, // 滑动模式使能位
  GTX31X_SENSITIVITY          = 0x20, // 键盘灵敏度
} Gtx31xRegister_t;

/**
 * @brief 触摸通道
 * 
 */
typedef enum
{
  GTX31X_CHANNEL_BIT_1        = 0x00, // 通道1
  GTX31X_CHANNEL_BIT_2        = 0x01, // 通道2
  GTX31X_CHANNEL_BIT_3        = 0x02, // 通道3
  GTX31X_CHANNEL_BIT_4        = 0x03, // 通道4
  GTX31X_CHANNEL_BIT_5        = 0x04, // 通道5
  GTX31X_CHANNEL_BIT_6        = 0x05, // 通道6
  GTX31X_CHANNEL_BIT_7        = 0x06, // 通道7
  GTX31X_CHANNEL_BIT_8        = 0x07, // 通道8
  GTX31X_CHANNEL_BIT_9        = 0x08, // 通道9
  GTX31X_CHANNEL_BIT_10       = 0x09, // 通道10
  GTX31X_CHANNEL_BIT_11       = 0x0A, // 通道11
  GTX31X_CHANNEL_BIT_12       = 0x0B, // 通道12
  GTX31X_CHANNEL_BIT_13       = 0x0C, // 通道13
  GTX31X_CHANNEL_BIT_14       = 0x0D, // 通道14
  GTX31X_CHAEENL_BIT_ALL      = 0x0F, // 全通道
} Gtx31xChannelBit_t;

/**
 * @brief 中断操作模式选择位
 * 
 */
typedef enum
{
  GTX31X_PULSE_MODE           = 0x00, // 脉冲模式
  GTX31X_LEVEL_MODE           = 0x01, // 电平模式
} Gtx31xInterruptMode_t;

/**
 * @brief 触摸模式选择
 * 
 */
typedef enum
{
  GTX31X_SINGLE_TOUCH_MODE    = 0x00, // 单触点模式
  GTX31X_MULTI_TOUCH_MODE     = 0x01, // 多触点模式
} Gtx31xTouchEngineMode_t;

/**
 * @brief 触摸失效周期
 * 
 */
typedef enum
{
  GTX31X_EXPIRE_5_SECOND      = 0x00, // 5秒
  GTX31X_EXPIRE_10_SECOND     = 0x01, // 10秒
  GTX31X_EXPIRE_15_SECOND     = 0x02, // 15秒
  GTX31X_EXPIRE_20_SECOND     = 0x03, // 20秒
  GTX31X_EXPIRE_25_SECOND     = 0x04, // 25秒
  GTX31X_EXPIRE_30_SECOND     = 0x05, // 30秒
  GTX31X_EXPIRE_35_SECOND     = 0x06, // 35秒
  GTX31X_EXPIRE_40_SECOND     = 0x07, // 40秒
} Gtx31xExpireTime_t;

/**
 * @brief 配置按键长按使能位
 * 
 */
typedef enum
{
  GTX31X_EXPIRE_DISABLE       = 0x00, // 失能
  GTX31X_EXPIRE_ENABLE        = 0x01, // 使能
} Gtx31xExpireEnable;

/**
 * @brief 配置长按过程中有新按键触发下失效时间是否累计
 * 
 */
typedef enum
{
  GTX31X_EXPIRE_ACCUMULATION = 0x00, // 累加
  GTX31X_EXPIRE_RESET        = 0x01, // 重置
} Gtx31xExpireMode;

/**
 * @brief 校准时间选择
 * 
 */
typedef enum
{
  GTX31X_CAL_0_MSEC           = 0x00, // 0毫秒
  GTX31X_CAL_100_MSEC         = 0x01, // 100毫秒
  GTX31X_CAL_200_MSEC         = 0x02, // 200毫秒
  GTX31X_CAL_300_MSEC         = 0x03, // 300毫秒
  GTX31X_CAL_400_MSEC         = 0x04, // 400毫秒
  GTX31X_CAL_500_MSEC         = 0x05, // 500毫秒
  GTX31X_CAL_600_MSEC         = 0x06, // 600毫秒
  GTX31X_CAL_700_MSEC         = 0x07, // 700毫秒
  GTX31X_CAL_800_MSEC         = 0x08, // 800毫秒
  GTX31X_CAL_900_MSEC         = 0x09, // 900毫秒
  GTX31X_CAL_1000_MEC         = 0x0A, // 1000毫秒
  GTX31X_CAL_1100_MEC         = 0x0B, // 1100毫秒
  GTX31X_CAL_1200_MEC         = 0x0C, // 1200毫秒
  GTX31X_CAL_1300_MEC         = 0x0D, // 1300毫秒
  GTX31X_CAL_1400_MEC         = 0x0E, // 1400毫秒
  GTX31X_CAL_NO               = 0x0F, // 不需要校准
} Gtx31xCalTime_t;

/**
 * @brief 
 * 
 */
typedef enum
{
  GTX31X_IDLE_H_1_MSEC        = 0x00, // 1毫秒
  GTX31X_IDLE_H_100_MSEC      = 0x01, // 100毫秒
  GTX31X_IDLE_H_200_MSEC      = 0x02, // 200毫秒
  GTX31X_IDLE_H_300_MSEC      = 0x03, // 300毫秒
  GTX31X_IDLE_H_400_MSEC      = 0x04, // 400毫秒
  GTX31X_IDLE_H_500_MSEC      = 0x05, // 500毫秒
  GTX31X_IDLE_H_600_MSEC      = 0x06, // 600毫秒
  GTX31X_IDLE_H_700_MSEC      = 0x07, // 700毫秒
  GTX31X_IDLE_H_800_MSEC      = 0x08, // 800毫秒
  GTX31X_IDLE_H_900_MSEC      = 0x09, // 900毫秒
  GTX31X_IDLE_H_1000_MSEC     = 0x0A, // 1000毫秒
  GTX31X_IDLE_H_1100_MSEC     = 0x0B, // 1100毫秒
  GTX31X_IDLE_H_1200_MSEC     = 0x0C, // 1200毫秒
  GTX31X_IDLE_H_1300_MSEC     = 0x0D, // 1300毫秒
  GTX31X_IDLE_H_1400_MSEC     = 0x0E, // 1400毫秒
  GTX31X_IDLE_H_1500_MSEC     = 0x0F, // 1500毫秒
} Gtx31xSensorIdleHTime_t;

/**
 * @brief 
 * 
 */
typedef enum
{
  GTX31X_IDLE_L_0_MSEC        = 0x00, // 0毫秒
  GTX31X_IDLE_L_10_MSEC       = 0x01, // 10毫秒
  GTX31X_IDLE_L_20_MSEC       = 0x02, // 20毫秒
  GTX31X_IDLE_L_30_MSEC       = 0x03, // 30毫秒
  GTX31X_IDLE_L_40_MSEC       = 0x04, // 40毫秒
  GTX31X_IDLE_L_50_MSEC       = 0x05, // 50毫秒
  GTX31X_IDLE_L_60_MSEC       = 0x06, // 60毫秒
  GTX31X_IDLE_L_70_MSEC       = 0x07, // 70毫秒
  GTX31X_IDLE_L_80_MSEC       = 0x08, // 80毫秒
  GTX31X_IDLE_L_90_MSEC       = 0x09, // 90毫秒
  GTX31X_IDLE_L_100_MSEC      = 0x0A, // 100毫秒
  GTX31X_IDLE_L_110_MSEC      = 0x0B, // 110毫秒
  GTX31X_IDLE_L_120_MSEC      = 0x0C, // 120毫秒
  GTX31X_IDLE_L_130_MSEC      = 0x0D, // 130毫秒
  GTX31X_IDLE_L_140_MSEC      = 0x0E, // 140毫秒
  GTX31X_IDLE_L_150_MSEC      = 0x0F, // 150毫秒
} Gtx31xSensorIdleLTime_t;

/**
 * @brief 繁忙到空闲间隔时间
 * 
 */
typedef enum
{
  GTX31X_BUSY_TO_IDLE_0_SEC   = 0x00, // 0秒
  GTX31X_BUSY_TO_IDLE_1_SEC   = 0x01, // 1秒
  GTX31X_BUSY_TO_IDLE_2_SEC   = 0x02, // 2秒
  GTX31X_BUSY_TO_IDLE_3_SEC   = 0x03, // 3秒
  GTX31X_BUSY_TO_IDLE_4_SEC   = 0x04, // 4秒
  GTX31X_BUSY_TO_IDLE_5_SEC   = 0x05, // 5秒
  GTX31X_BUSY_TO_IDLE_6_SEC   = 0x06, // 6秒
  GTX31X_BUSY_TO_IDLE_7_SEC   = 0x07, // 7秒
} Gtx31xBusyToIdleTime_t;

/**
 * @brief 空闲到忙模式控制位
 * 
 */
typedef enum
{
  GTX31X_AUTO_MODE            = 0x00, // 自动模式
  GTX31X_MANUAL_MODE          = 0x01, // 手动模式
} Gtx31xIdleToBusyCpntorl_t;

/**
 * @brief 滑动模式使能位
 * 
 */
typedef enum
{
  GTX31X_SLIDE_DISABLE        = 0x00, // 开启
  GTX31X_SLIDE_ENABLE         = 0x01, // 关闭
} Gtx31xSlideModeEn_t;

typedef enum
{
  GTX31X_SLEEP_DISABLE        = 0x00, // 关闭
  GTX31X_SLEEP_ENABLE         = 0x01, // 开启
} Gtx31xSleepModeEn_t;

/**
 * @brief 获取芯片ID
 *
 * @return uint8_t
 */
extern uint8_t Gtx31xGetChipId(void);

/**
 * @brief 获取通道触摸检查状态
 *
 * @return uint16_t - 信道触摸状态
 */
extern uint16_t Gtx31xGetTouchDetectionBit(void);

/**
 * @brief 设置特定通道使能/禁用位
 *
 * @param Channel   - 通道
 * @param ControlEn - 使能位
 */
extern void Gtx31xSetEachOfChannelContorlBit(uint8_t Channel, bool ControlEn);

/**
 * @brief 软件重启
 *
 * @param En - 使能位（true：使能 false：失能）
 */
extern void Gtx31xSoftwareReset(bool En);

/**
 * @brief 配置睡眠模式
 *
 * @param En - 使能位（true：使能 false：失能）
 */
extern void Gtx31xSetSleepMode(bool En);

/**
 * @brief 获取睡眠状态寄存器数值
 *
 * @return uint8_t - 睡眠状态寄存器
 */
extern uint8_t Gtx31xGetSleepRegister(void);

/**
 * @brief 配置I2C上拉控制位
 *
 * @param PullUp - 控制位
 */
extern void Gtx31xSetPullUpContorlBit(bool ContorEn);

/**
 * @brief 配置中断模式
 *
 * @param Mode - 中断模式
 */
extern void Gtx31xSetInterruptOperationMode(uint8_t Mode);

/**
 * @brief 配置触发模式
 *
 * @param Mode - 触发模式
 */
extern void Gtx31xSetTouchEngineMode(uint8_t Mode);

/**
 * @brief 配置触发失效参数
 *
 * @param Time   - 失效时间
 * @param Enable - 使能控制位
 * @param Mode   - 模式
 */
extern void Gtx31xSetTouchExpireMode(uint8_t Time, uint8_t Enable, uint8_t Mode);

/**
 * @brief 配置校准时间选择位
 *
 * @param Time - 校准时间
 */
extern void Gtx31xSetCalibrationTime(uint8_t Time);

/**
 * @brief 设置空闲周期
 *
 * @param Time_H - 周期（高位）
 * @param Time_L - 周期（低位）
 */
extern void Gtx31xSetSensorIdleTime(uint8_t Time_H, uint8_t Time_L);

/**
 * @brief 配置繁忙时间
 *
 * @param Time - 繁忙时间
 */
extern void GtxSetBuysToIdleTime(uint8_t Time);

/**
 * @brief 空闲到忙模式控制位
 *
 * @param En - 配置位
 */
extern void Gtx31xIdleToBusyContorlBit(uint8_t En);

/**
 * @brief 配置是否开启滑动模式
 *
 * @param En - 配置位
 */
extern void Gtx31xSlideModeEnableBit(uint8_t En);

/**
 * @brief 设置通道灵敏度
 *
 * @param Channel - 通道
 * @param Value   - 灵敏度
 */
extern void Gt312SetTouchSensitivityControlBit(uint8_t Channel, uint8_t Value);

/**
 * @brief 写特殊寄存器
 *
 * @param Register - 寄存器地址
 * @param Value    - 写入的数值
 */
extern void Gtx31xWriteSpecialRegister(uint8_t Register, uint8_t Value);

#endif
#endif
